package com.tecso.btx.admin.modelo;

import java.util.Map;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.MapKey;
import javax.persistence.OneToOne;

@Entity
public class Usuario {
    
	@Id
	@Column
    @GeneratedValue 
    private long id_usuario;
    
	@Column(length=32, unique=true)
	private String nombre_usuario;
	
	@Column
    private String password;
    
    @Column
	private long fecha_alta;
	
	@Column
	private long fecha_modificacion;
    
    
    @OneToOne(orphanRemoval=true, cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private DatosPersonales datosPersonales;
    
    
    @ManyToOne(fetch=FetchType.EAGER)
	private Rol rol;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name="usuario_recurso", 
    	
    	joinColumns={
    		@JoinColumn(name="id_usuario", referencedColumnName="id_usuario")
    	}, 
    	inverseJoinColumns={
    		@JoinColumn(name="id_recurso", referencedColumnName="id_recurso")
    	}
    )
    @MapKey(name="id_recurso")
    private Map<Integer, Recurso> recursos;
    
    
	@ManyToMany(fetch = FetchType.LAZY)
	@JoinTable(name="usuario_grupo", 
 		
		joinColumns={
	 		@JoinColumn(name="id_usuario", referencedColumnName="id_usuario")
	 	}, 
	 	inverseJoinColumns={
	 		@JoinColumn(name="id_grupo", referencedColumnName="id_grupo")
	 	}
	)
	@MapKey(name="id_grupo")
	private Map<Integer, Grupo> grupos;
    
    
	
	public String getNombre_usuario() {
		return nombre_usuario;
	}


	public void setNombre_usuario(String nombre_usuario) {
		this.nombre_usuario = nombre_usuario;
	}


	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}


	public DatosPersonales getDatosPersonales() {
		return datosPersonales;
	}


	public void setDatosPersonales(DatosPersonales datosPersonales) {
		this.datosPersonales = datosPersonales;
	}

	public Rol getRol() {
		return rol;
	}


	public void setRol(Rol rol) {
		this.rol = rol;
	}


	public Map<Integer, Grupo> getGrupos() {
		return grupos;
	}


	public void setGrupos(Map<Integer, Grupo> grupos) {
		this.grupos = grupos;
	}


	public Map<Integer, Recurso> getRecursos() {
		return recursos;
	}


	public void setRecursos(Map<Integer, Recurso> recursos) {
		this.recursos = recursos;
	}


	public Long getId_usuario() {
		return id_usuario;
	}


	public long getFecha_alta() {
		return fecha_alta;
	}


	public void setFecha_alta(long fecha_alta) {
		this.fecha_alta = fecha_alta;
	}


	public long getFecha_modificacion() {
		return fecha_modificacion;
	}


	public void setFecha_modificacion(long fecha_modificacion) {
		this.fecha_modificacion = fecha_modificacion;
	}


    
}